import {
  WebSocketGateway,
  SubscribeMessage,
  MessageBody,
  ConnectedSocket,
} from '@nestjs/websockets';
import { Socket } from 'socket.io';
import { Logger } from 'src/common/logger/logger';

// - socketTest 使用 默认的响应模式 ，响应会发送回与请求相同的事件通道
// - socketTest_Event 使用 自定义事件响应模式 ，通过指定 event 字段，将响应发送到不同的事件通道
@WebSocketGateway({
  cors: true,
  maxHttpBufferSize: 1e8,
})
export class SocketGateway {
  constructor(
    // private readonly socketService: SocketService,
    private logger: Logger,
  ) {}

  //简单确认信息示例
  @SubscribeMessage('socketTest')
  socketTest(@MessageBody() data: any) {
    this.logger.log('收到客户端发送的数据：', JSON.stringify(data));
    return {
      response: {
        msg1: '测试1',
        msg2: '测试2',
      },
      clientData: data,
    };
  }

  /**
   * 转发示例
   * @param data
   * @returns  event: 'socketTest2' 转发数据到socketTest2 事件上
   */
  @SubscribeMessage('socketTest_Event')
  socketTest_Event(@MessageBody() data: any) {
    this.logger.log('收到客户端发送的数据：', JSON.stringify(data));

    // - 消息传递方式 ：客户端会在新的事件名 socketTest2 下收到响应，而不是原始的 socketTest_Event
    // - 适用场景 ：需要将消息转发到不同事件通道的场景，实现事件的路由或重定向
    return {
      event: 'socketTest2',
      data,
    };
  }

  /**
   * 广播示例
   * clinet.broadcast： 除了当前发送数据的客户端之外，所有客户端都能收到消息
   * @param data
   * @param clinet
   * @returns
   */
  @SubscribeMessage('socketTest_Broadcast')
  socketTest_Broadcast(
    @MessageBody() data: any,
    @ConnectedSocket() client: Socket,
  ) {
    client.broadcast.emit('socketTest3', data); // 使用client.broadcast.emit向除了当前客户端之外的所有客户端发送消息

    // 返回数据给当前客户端
    return {
      event: 'socketTest3',
      data,
    };
  }
}
